﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Reporting.WebForms;
using SIBI.Helpers;
using SIBI.Reports;
using SIBI.Models;

namespace SIBI.Reports.EtiquetasBI
{
    public partial class Reporte : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            if (!Page.IsPostBack)
            {
                this.Button1.OnClientClick = "return $('.cargador', parent.document).css('display', 'block').length>0;";
                //f_Reporte(true);
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            f_Reporte(false);
        }

        // definir Estructura para el Reporte.
        

        private void f_Reporte(bool tbPrimeraEntrada)
        {
            // Obtener Parametros

            DateTime? fechaAdquisiciond = null;
            DateTime? fechaAdquisicionh = null;
            DateTime fecha;
            if (DateTime.TryParse(this.txtFechaAdquisiciond.Text, out fecha)) fechaAdquisiciond = fecha;
            if (DateTime.TryParse(this.txtFechaAdquisicionh.Text, out fecha)) fechaAdquisicionh = fecha;
            string lsusuario = txtUsuario.Text.TrimEnd();
            string lsserial = this.txtSerial.Text.TrimEnd();
            string lsanexo = this.txtAnexo.Text.TrimEnd();
            string lsclase = txtClase.Text.TrimEnd();
            string lstipobien = txtTipoBien.Text.TrimEnd();
            string lsestado = txtEstado.Text.TrimEnd();
            
            //Crear Datasets que usa el Reporte
            ReportHelper.RepDataSet<string> tblReporte = new ReportHelper.RepDataSet<string>("Reporte", "repNombre");
            ReportHelper.RepDataSet<string> tblEtiquetas = new ReportHelper.RepDataSet<string>("BienesInformaticos", 
                "fila,Bien1,Sena1,Sanf1,Ctip1,Bien2,Sena2,Sanf2,Ctip2,Bien3,Sena3,Sanf3,Ctip3,Ver3");

            tblReporte.Rows.Add(new object[] { "Reporte de Etiquetas" });

            using (SIBIContext db = new SIBIContext())
            using (TEJECUTIVOContext dbt = new TEJECUTIVOContext())
            {
                int lnvoy = 0, lnfil = 0, lncol = 0;
                object[] datos = new object[] { 0, "", "", "", "", "", "", "", "", "", "", "", "", 0 };
                foreach (BienInformatico tbien in db.BienInformaticoes
                             .Where(tbien =>
                                (String.IsNullOrEmpty(lsclase) || tbien.nmym.ncob.cnom.Contains(lsclase)) &&
                                (String.IsNullOrEmpty(lstipobien) || tbien.ntib.cnom.Contains(lstipobien)) &&
                                (String.IsNullOrEmpty(lsestado) || tbien.nest.cnom.Contains(lsestado)) &&
                                (String.IsNullOrEmpty(lsserial) || tbien.BienInformaticoId.Contains(lsserial)) &&
                                (String.IsNullOrEmpty(lsanexo) || tbien.nanf.Contains(lsanexo)) &&
                                (String.IsNullOrEmpty(lsusuario) || tbien.ncar.empleados.Contains(lsusuario)) &&
                                ((fechaAdquisiciond == null) ||
                                    ((fechaAdquisicionh == null) && (tbien.dfva == fechaAdquisiciond)) ||
                                    ((tbien.dfva >= fechaAdquisiciond) && (tbien.dfva <= fechaAdquisicionh))
                                )
                              )
                  )
                {
                    lnfil = lnvoy / 3;
                    lncol = lnvoy % 3;
                    if ((lncol).Equals(0))
                    {
                        datos[0] = lnfil;
                        datos[1] = tbien.BienInformaticoId.TrimEnd();
                        datos[2] = (tbien.nena ?? "").TrimEnd();
                        datos[3] = (tbien.nanf ?? "").TrimEnd();
                        datos[4] = (tbien.ntib.cnom ?? "").TrimEnd();
                    }
                    if ((lncol).Equals(1))
                    {
                        datos[5] = tbien.BienInformaticoId.TrimEnd();
                        datos[6] = (tbien.nena ?? "").TrimEnd();
                        datos[7] = (tbien.nanf ?? "").TrimEnd();
                        datos[8] = (tbien.ntib.cnom ?? "").TrimEnd();
                    }
                    if ((lncol).Equals(2))
                    {
                        datos[9] = tbien.BienInformaticoId.TrimEnd();
                        datos[10] = (tbien.nena ?? "").TrimEnd();
                        datos[11] = (tbien.nanf ?? "").TrimEnd();
                        datos[12] = (tbien.ntib.cnom ?? "").TrimEnd();
                        lncol = -1;
                        tblEtiquetas.Rows.Add(datos);
                        datos[1] = datos[2] = datos[3] = datos[4] = datos[5] = datos[6] = datos[7] = datos[8] = datos[9] = datos[10] = datos[11] = datos[12] = "";
                    }
                    lnvoy++;
                    if (!Page.IsPostBack) break;
                }
                if (lncol >= 0) tblEtiquetas.Rows.Add(datos);

                ReportViewer1.Reset();
                this.framePDF.Attributes.Add("SRC",
                ReportHelper.GetReportFile(ReportViewer1, "/REP/REP_EtiquetaBI.rdl", "Reporte,BienesInformaticos",
                    new object[] { tblReporte, tblEtiquetas }
                    , null));
            }

        }// f_Reporte()

        


        /// <summary>
        /// 
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="tcid"></param>
        /// <returns></returns>
        private string GetLocalidad(TEJECUTIVOContext ctx, string tcid )
        {
            LOCALIDAD localidad =  ctx.LOCALIDAD.Where(s => s.localidad_id.Equals(tcid == null ? "" : tcid)).FirstOrDefault<LOCALIDAD>();
            return (localidad!=null)?localidad.localidad_nombre:"no tiene";
        }
        private string GetCeco(TEJECUTIVOContext ctx, string tcid)
        {
            CECO ceco = ctx.CECO.Where(s => s.ceco_id.Equals(tcid==null?"":tcid)).FirstOrDefault<CECO>();
            return (ceco!=null)?ceco.ceco_descripcion:"no tiene";
        }
    }
}



///// Grouping: http://geeks.ms/blogs/jmtorres/archive/2009/10/30/groupby-con-linq-to-objects.aspx
//                ReportHelper.SetReportData(ReportViewer1, "/REP/REP_EtiquetaBI.rdl", "Reporte,BienesInformaticos", 
//                    new object[] { tblReporte, qbuscar.Select((x, index) => new
//                                            {    fila = index,
//                                                 BienInformaticoId = x.BienInformaticoId,
//                                                 sanf=x.sanf,
//                                                 sena=x.sena
//                                            }).ToList().GroupBy( bien => (bien.fila/3),
//                                                ( serie, filas) => new 
//                                                {
//                                                    fila = serie,
//                                                    Bien1 = filas.Max( c => c.fila % 3 == 0 ? c.BienInformaticoId : ""),
//                                                    Sena1 = filas.Max( c => c.fila % 3 == 0 ? c.sena : ""),
//                                                    Bien2 = filas.Max( c => c.fila % 3 == 1 ? c.BienInformaticoId : ""),
//                                                    Sena2 = filas.Max( c => c.fila % 3 == 1 ? c.sena : ""),
//                                                    Bien3 = filas.Max( c => c.fila % 3 == 2 ? c.BienInformaticoId : ""),
//                                                    Sena3 = filas.Max( c => c.fila % 3 == 2 ? c.sena : ""),
//                                                    Ver3 = filas.Sum( c => c.fila % 3 == 2 ? 1 : 0)
//                                                }
//                                            ).ToList()
//                        }
//                    , null);